package com.css.ids.server.service;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.css.apps.base.dict.model.SDict;
import com.css.apps.base.func.model.SFunc;
import com.css.apps.base.menu.model.MenuItem;
import com.css.apps.base.menu.model.SMenu;
import com.css.apps.base.org.model.SOrg;
import com.css.apps.base.org.model.SOrgPost;
import com.css.apps.base.org.model.SUserOrg;
import com.css.apps.base.post.model.SPost;
import com.css.apps.base.post.model.SPostRole;
import com.css.apps.base.role.model.SRole;
import com.css.apps.base.role.model.SRoleFunc;
import com.css.apps.base.sys.model.SSys;
import com.css.apps.base.sysjob.model.SysJob;
import com.css.apps.base.user.leader.model.LeaderSecretary;
import com.css.apps.base.user.model.SUser;
import com.css.apps.base.user.model.SUserPost;
import com.css.apps.base.user.model.SUserRole;
import com.css.core.model.IServiceResult;
import com.css.core.model.tree.TreeNode;

import net.sf.json.JSONObject;

public interface IdsService {
	
	// ------------------------------------------------- USER ------------------------------------\\
	/**
	 * 根据用户ID获取用户基本信息
	 */
	public SUser getUser(String userId);
	
	/**
	 * 批量获取用户对象
	 *
	 * @author liuhy 2019-2019年3月3日
	 */
	public List<SUser> listUsers(Collection<String> userIds);
	
	/**
	 * 根据登录名获取用户所有信息, 加载用户权限信息
	 */
	public SUser getAuth(String loginName, String sysId);

	/**
	 * 根据特定条件查询用户
	 * 
	 * @param conditions
	 *            以'<条件, 条件值>'的形式传值<br />
	 *            如果传入null, 则返回null
	 * @return 如果有满足要求的用户, 则返回用户对象<br />
	 *         如果没有满足要求的用户, 则返回null;
	 * @author liuhy 2017年3月6日
	 */
	public List<SUser> listUsersByConditions(Map<String, Object> conditions);

	/**
	 * 根据登录名, 密码获取一个合法用户
	 * 
	 * @param loginName
	 *            用户的登录名
	 * @param loginPwd
	 *            密码
	 * @return userType = 1, openFlag = 1, delFlag = 2的用户对象
	 * @author liuhy 2017年3月3日
	 */
	public SUser getValidUser(String loginName, String loginPwd);

	/**
	 * 根据用户名称模糊查询用户基本信息列表
	 */
	public List<SUser> listUsersByName(String userName);

	/**
	 * 根据机构ID获取用户基本信息列表
	 */
	public List<SUser> listUsersByDept(String deptId, boolean withChildren);
	
	/**
	 * 根据机构ID和岗位ID获取当前机构下用户基本信息列表
	 */
	public List<SUser> listUsersByOrgPost(String orgId, String postId);

	// TODO
	/**
	 * 通过厅级部门ID, 查找该厅级部门及其子部门下特定岗位人员
	 * 
	 * @param secondOrgId
	 *            厅级部门orgId
	 * @param postId
	 * @return
	 * @author liuhy 2017年3月29日 下午5:21:34
	 */
	public List<SUser> listUsersBySecondOrgPost(String secondOrgId, String postId);

	/**
	 * 根据机构ID和岗位ID获取当前机构及其子机构下用户基本信息列表
	 * 
	 * @param orgId
	 * @param postId
	 * @return
	 */
	public List<SUser> listUsersByParentOrgPost(String orgId, String postId);

	/**
	 * 通过系统及机构(部门)查询相关人员
	 */
	public List<SUser> listUsersBySysAndOrg(List<String> sysId, List<String> orgId);
	
	/**
	 * 修改用户可修改字段<br />
	 * 目前可修改字段: email, mobile, password
	 * 
	 * @param conditions
	 * @return
	 * @author liuhy 2017年3月17日 下午7:02:10
	 */
	public boolean updUsers(Map<String, Map<String, Object>> conditions);

	/**
	 * 同步用户基本信息
	 * 
	 * @param time
	 *            time为null为全量，time有值时为增量
	 * @param sysId
	 * @return List<SUser>
	 */
	public List<SUser> syncUsers(Date time, String sysId);

	/**
	 * 获取所有的用户
	 * 
	 * @return 用户对象集合
	 * @author liuhy 2017年3月3日 下午2:56:33
	 */
	public List<SUser> listAllUser();

	/**
	 * 按照单位层级查询对应层级所有单位的所有人员
	 * 
	 * @param orgLevel
	 *            单位层级
	 * @return 用户对象集合
	 * @author liuhy 2019-2019年2月28日
	 */
	public List<SUser> listAllUser(int orgLevel);

	/**
	 * 根据单位ID查询本单位所有人员
	 * 
	 * @param corpId
	 *            单位UUID
	 * @author liuhy 2019-2019年2月28日
	 */
	public List<SUser> listCorporationAllUser(String corpId);

	/**
	 * 根据添加用户流程添加用户 
	 * @author liuhy 2018年9月5日
	 */
	public IServiceResult<JSONObject> addOrUpdUser(SUser user, List<SysJob> sysjobList);

	// ------------------------------------------------- PASSWORD VALIDATE ------------------------------------\\
	/**
	 * 密码校验的数据结构
	 */
	public final class TYPE_PWD {
		/** 登录密码 */
		public static String LOGIN = "1";
		/** 签章密码 */
		public static String REVIEW = "2";
	}

	/**
	 * 验证码校验的数据结构
	 */
	public final class TYPE_CHECKCODE {
		/** 二维码 */
		public static String DDCODE = "1";
		/** 验证码 */
		public static String CHECKCODE = "2";
		/** 签名包 */
		public static String SIGN = "3";
	}

	/**
	 *
	 * @param type
	 *            TYPE_PWD(登录密码/签章密码)
	 */
	public boolean checkPwd(String type, String userId, String password);

	/**
	 * 生成验证码(二维码/验证码/签名包)
	 */
	public String getCheckCode(String type, String userId);

	/**
	 * 校验验证码(二维码/验证码/签名包)
	 */
	public boolean checkCodeAuth(String type, String userId, String code);

	// ------------------------------------------------- ORG ------------------------------------\\
	/** 机构类型-全部, 包含机构(公司)与部门(处室) */
	public static final String ALL_ORG_TYPE = "0";
	/** 机构类型-机构(公司) */
	public static final String ORG_ORG_TYPE = "1";
	/** 机构类型-部门(处室) */
	public static final String DEPT_ORG_TYPE = "2";

	/**
	 * 组织机构列表的数据结构
	 */
	public final class TYPE_ORG {
		/** 机构树 */
		public static String ORG = "1";
		/** 机构用户树 */
		public static String ORG_USER = "2";
		/** 机构用户岗位树 */
		public static String ORG_USER_POST = "3";
	}

	/**
	 * 根据机构ID获取机构基本信息
	 */
	public SOrg getOrg(String orgId);

	/**
	 * 通过机构ID获取机构列表
	 */
	public List<SOrg> listOrgs(Collection<String> orgIds);

	/**
	 * 获取所有机构ID集合
	 */
	public List<String> listOrgIds();

	/**
	 *
	 * @param dataType
	 *            组织机构列表的数据结构:TYPE_ORG
	 * @param params
	 *            机构树的自定义样式参数
	 * @return TreeNode[]
	 */
	public List<TreeNode> listOrgs(String dataType, String params);

	/**
	 * 同步机构基本信息
	 * 
	 * @param time
	 *            time为null为全量，time有值时为增量
	 * @return Org
	 */
	public List<SOrg> syncOrgs(Date time);

	/**
	 * 获取所有的机构
	 * @author liuhy 2017年3月3日
	 */
	public List<SOrg> listAllOrg();

	/**
	 * 获取所有的机构
	 * 
	 * @param orgLevel
	 * 	不指定层级请写0
	 * @return 机构对象集合
	 * @author liuhy 2017年3月3日
	 */
	public List<SOrg> listAllOrg(int orgLevel);

	/**
	 * 根据机构层级[选填]及机构类型获取所有的机构
	 * 
	 * @param orgLevel
	 * 	(0->全部, 1->机构, 2->部门或处室)
	 * @param orgType
	 *            机构类型 
	 *            com.css.ids.server.service.ALL_ORG_TYPE ==> 单位+部门
	 *            com.css.ids.server.service.ORG_ORG_TYPE ==> 单位
	 *            com.css.ids.server.service.DEPT_ORG_TYPE ==> 部门
	 * @return 机构对象集合
	 * @author liuhy 2017年3月3日
	 */
	public List<SOrg> listAllOrg(int orgLevel, String orgId, String orgType);

	// ------------------------------------------------- POST ------------------------------------\\
	/**
	 * 根据岗位ID获取岗位信息
	 */
	public SPost getPost(String postId);

	/**
	 * 根据岗位名称获取岗位对象ID
	 * @author liuhy 2019-2019年3月20日
	 */
	public List<String> listPostsByNames(String...postNames);
	
	/**
	 * 批量获取岗位对象
	 * @author liuhy 2019-2019年3月1日
	 */
	public List<SPost> listPosts(Collection<String> postIds);
	
	/**
	 * @param isGroup
	 *            true 获取所有的公共群组 false 获取所有的岗位
	 * @return
	 */
	public List<SPost> listAllPost(boolean isGroup);

	// ------------------------------------------------- MENU ------------------------------------\\
	/**
	 * 根据菜单ID获取菜单信息
	 */
	public SMenu getMenu(String menuId);

	/**
	 * 根据用户ID获取菜单列表
	 */
	public List<MenuItem> listMenus(String userId, String sysId);

	/**
	 * 根据角色ID获取角色所能访问的菜单列表
	 */
	public List<MenuItem> listMenusByRole(String roleId, String sysId);

	// ------------------------------------------------- DICT ------------------------------------\\
	/**
	 * 根据table和code来获取字典项
	 */
	public SDict getDictByTableCode(String table, String code);

	/**
	 * 通过table名称获取字典列表
	 */
	public List<SDict> listDictsByTable(String table);

	/**
	 * 通过字典ID获取字典列表
	 */
	public List<SDict> listDicts(Collection<String> dictIds);

	// ------------------------------------------------- ROLE ------------------------------------\\
	/**
	 * 通过role的uuid获取角色信息
	 * @author liuhy 2017年3月13日
	 */
	public SRole getRole(String roleId);
	
	/**
	 * 批量获取SRole对象
	 *
	 * @author liuhy 2019-2019年3月3日
	 */
	public List<SRole> listRoles(Collection<String> roleIds);

	/**
	 * 根据特定条件查询角色信息
	 * 
	 * @param conditions
	 *            以'条件,操作符,条件值'的形式传值<br />
	 *            目前操作符暂只支持like, =, >, >=, <, <=, !=, and 暂不支持or及括号运算符及其他运算符
	 *            如果传入null, 则返回null 如果有满足要求的角色, 则返回角色对象<br />
	 *            如果没有满足要求的角色, 则返回null;
	 * @author liuhy 2017年3月13日 下午4:59:05
	 */
	public List<SRole> listRolesByCondition(List<String> condition);

	// ------------------------------------------------- FUNC ------------------------------------\\
	/**
	 * 通过SFunc的uuid获取SFunc对象
	 * @author liuhy 2017年3月14日
	 */
	public SFunc getFunc(String uuid);
	
	/**
	 * 批量获取SFunc对象
	 * @author liuhy 2019-2019年3月3日
	 */
	public List<SFunc> listFuncs(Collection<String> funcIds);
	
	/**
	 * 通过用户ID及系统ID获取其相关的功能项
	 */
	public List<SFunc> listFuncsByUser(String userId, String sysId);

	// ------------------------------------------------- SYS ------------------------------------\\
	/**
	 * 通过系统id，获取系统对象信息
	 */
	public SSys getSys(String sysId);
	
	/**
	 * 批量获取SSys对象
	 * 
	 * @author liuhy 2019-2019年3月3日
	 */
	public List<SSys> listSys(Collection<String> sysIds);

	/**
	 * 获取所有系统
	 */
	public List<SSys> listSys();
	
	// ------------------------------------------------- SYSJOB ------------------------------------\\
	/**
	 * 通过组织机构Id和职务Id，获取所有系统角色权限对象信息
	 */
	public List<SysJob> listSysJob(String orgId, String jobId);

	// ------------------------------------------------- RELATE ------------------------------------\\

	public List<SUserOrg> listUserOrg();
	
	public List<SUserPost> listUserPost();

	public List<SPostRole> listPostRole();

	public List<SOrgPost> listOrgPost();
	
	public List<SRoleFunc> listRoleFunc();

	public List<SUserRole> listUserRole();
	
	public List<LeaderSecretary> listLeaderSecretaries();
	
}
